/*!
 * \file pool_adaptors.hpp
 * \brief 线程池适配器
 *
 * \details 此文件包含易于使用的线程池适配器，类似于pool类的智能指针。
 *          
 *          线程池适配器提供：
 *          - 便利的任务调度函数
 *          - Runnable对象的自动调度
 *          - 智能指针风格的接口封装
 *          - 模板化的通用任务支持
 *          
 *          这些适配器简化了线程池的使用，提供了更直观的
 *          编程接口，特别适合需要频繁调度任务的应用场景。
 *
 * Copyright (c) 2005-2007 Philipp Henkel
 *
 * Use, modification, and distribution are  subject to the
 * Boost Software License, Version 1.0. (See accompanying  file
 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 *
 * http://threadpool.sourceforge.net
 *
 */


#ifndef THREADPOOL_POOL_ADAPTORS_HPP_INCLUDED
#define THREADPOOL_POOL_ADAPTORS_HPP_INCLUDED

#include <boost/smart_ptr.hpp>

namespace boost { namespace threadpool
{

// TODO convenience scheduling function
    /*!
     * \brief 调度Runnable对象异步执行
     * 
     * \details 为异步执行调度一个Runnable对象。Runnable是一个具有run()
     *          成员函数的任意类。这是pool->schedule(bind(&Runnable::run, task_object))
     *          的便利简写形式。
     *          
     * \tparam Pool 线程池类型
     * \tparam Runnable 可运行对象类型，必须具有run()成员函数
     * \param pool 线程池引用
     * \param obj Runnable对象的智能指针。成员函数run()将被执行，且不应抛出异常。
     * \return 如果任务能够被调度则返回true，否则返回false
     */  
    template<typename Pool, typename Runnable>
    bool schedule(Pool& pool, shared_ptr<Runnable> const & obj)
    {	
      return pool->schedule(bind(&Runnable::run, obj));
    }	
    
    /*!
     * \brief 调度任务异步执行（池引用版本）
     * 
     * \details 为异步执行调度一个任务。任务只会被执行一次。
     *          此版本接受线程池的引用。
     *          
     * \tparam Pool 线程池类型
     * \param pool 线程池引用
     * \param task 任务函数对象
     * \return 如果任务能够被调度则返回true，否则返回false
     */  
    template<typename Pool>
    typename enable_if < 
      is_void< typename result_of< typename Pool::task_type() >::type >,
      bool
    >::type
    schedule(Pool& pool, typename Pool::task_type const & task)
    {	
      return pool.schedule(task);
    }	

    /*!
     * \brief 调度任务异步执行（智能指针版本）
     * 
     * \details 为异步执行调度一个任务。任务只会被执行一次。
     *          此版本接受线程池的智能指针。
     *          
     * \tparam Pool 线程池类型
     * \param pool 线程池的智能指针
     * \param task 任务函数对象
     * \return 如果任务能够被调度则返回true，否则返回false
     */
    template<typename Pool>
    typename enable_if < 
      is_void< typename result_of< typename Pool::task_type() >::type >,
      bool
    >::type
    schedule(shared_ptr<Pool> const pool, typename Pool::task_type const & task)
    {	
      return pool->schedule(task);
    }	

} } // namespace boost::threadpool

#endif // THREADPOOL_POOL_ADAPTORS_HPP_INCLUDED


